﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Text.RegularExpressions;

namespace RM.Common
{
    public class Regexlib
    {
        /// <summary>
        /// 判断字符串是否是a-zA-Z0-9_范围内（3-50位范围内）
        /// </summary>
        /// <param name="strIn"></param>
        /// <returns></returns>
        public static bool IsValidUserName(string strIn)
        {
            return Regex.IsMatch(strIn, @"^[A-Za-z0-9_]{3,50}$");
        }
        /// <summary>
        /// 验证邮箱
        /// </summary>
        /// <param name="strIn"></param>
        /// <returns></returns>
        public static bool IsValidEmail(string strIn)
        {
            return Regex.IsMatch(strIn, @"^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$");
        }
        /// <summary>
        /// 验证手机
        /// </summary>
        /// <param name="strIn"></param>
        /// <returns></returns>
        public static bool IsValidMobile(string strIn)
        {
            return Regex.IsMatch(strIn, @"^[1]+[3,5,8]+\d{9}");
        }
       /// <summary>
       /// 验证手机号
       /// </summary>
        /// <param name="strIn"></param>
       /// <returns></returns>
        public static bool IsValidTelPhone(string strIn)
        {
            return Regex.IsMatch(strIn, @"^(\d{3,4}-)?\d{6,8}$");

        }
        #region 15位和18位身份证验证
        /*
        一、18位的身份证号码
        如：130429####%%%%0078
        1、1~6位为地区代码，其中1、2位数为各省级政府的代码，3、4位数为地、市级政府的代码，5、6位数为县、区级政府代码。如13（河北省）04（邯郸市）29（永年县）
        2、7~14位为出生年月日
        3、15~17位为顺序号，是县、区级政府所辖派出所的分配码，每个派出所分配码为10个连续号码，例如“000-009”或“060-069”，其中单数为男性分配码，双数为女性分配码，
           如遇同年同月同日有两人以上时顺延第二、第三、第四、第五个分配码。如：007的就是个男生 而且和他同年月日生的男生至少有两个 他们的后四位是001* 和 003*
        4、18位为效验位（识别码），通过复杂公式算出，普遍采用计算机自动生成。是前面17位的一种检验代码，如果你改变了前面某个数字而后面的效验代码不响应改变就会被计算
           软件判断为非法身份正号码。X也是效验代码的一中  

        二、15位的身份证号码

        1、1~6位为地区代码
        2、7~8位为出生年份(2位)，9~10位为出生月份，11~12位为出生日期
        3、第13~15位为顺序号，并能够判断性别，奇数为男，偶数为女。
         */
        //校验15位身份证
        public bool CheckIDCard15(string idCard)
        {
            long n = 0;
            if (long.TryParse(idCard, out n) == false || n < Math.Pow(10, 14))
            {
                return false;//数字验证
            }
            string address = "11x22x35x44x53x12x23x36x45x54x13x31x37x46x61x14x32x41x50x62x15x33x42x51x63x21x34x43x52x64x65x71x81x82x91";
            if (address.IndexOf(idCard.Remove(2)) == -1)
            {
                return false;//省验证
            }
            string birth = idCard.Substring(6, 6).Insert(4, "-").Insert(2, "-");
            DateTime time = new DateTime();
            if (DateTime.TryParse(birth, out time) == false)
            {
                return false;
            }
            return true;
        }
        //校验18位身份证
        private bool CheckIDCard18(string idCard)
        {
            long n = 0;
            if (long.TryParse(idCard.Remove(17), out n) == false || n < Math.Pow(10, 16) || long.TryParse(idCard.Replace('x', '0').Replace('X', '0'), out n) == false)
            {
                return false;//数字验证
            }

            string address = "11x22x35x44x53x12x23x36x45x54x13x31x37x46x61x14x32x41x50x62x15x33x42x51x63x21x34x43x52x64x65x71x81x82x91";

            if (address.IndexOf(idCard.Remove(2)) == -1)
            {
                return false;//省份验证
            }
            string birth = idCard.Substring(6, 8).Insert(6, "-").Insert(4, "-");
            DateTime time = new DateTime();
            if (DateTime.TryParse(birth, out time) == false)
            {
                return false;//生日验证
            }
            string[] arrVarifyCode = ("1,0,x,9,8,7,6,5,4,3,2").Split(',');
            string[] Wi = ("7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2").Split(',');
            char[] Ai = idCard.Remove(17).ToCharArray();
            int sum = 0;
            for (int i = 0; i < 17; i++)
            {
                sum += int.Parse(Wi[i]) * int.Parse(Ai[i].ToString());
            }
            int y = -1;
            Math.DivRem(sum, 11, out y);
            if (arrVarifyCode[y] != idCard.Substring(17, 1).ToLower())
            {
                return false;//校验码验证
            }
            return true;//符合GB11643-1999标准

        }

        #endregion
    }
}
